抖音云原生向量数据库从“非主流”到“新常态”的演变
主要内容包括以下方面:
1. 向量数据库产生的背景
2. 向量数据库的技术演进
3. 向量数据库的应用展望
01
向量数据库产生的背景
文本泛化能力、语义检索能力不足 基于切词结果,难以推广到图片视频等多模态场景 数据持续增长时性能不足
如何衡量向量间的相似性?通常使用的度量方式有欧氏距离、内积和余弦距离。 需要检索出多少个结果?通常指定一个整数topK。 如何评估检索效果?需要平衡检索精度和检索效率两个指标
近似最近邻算法(ANN)。借助辅助结构进行剪枝,以加快检索速度,常见的有:HNSW,IVF。 量化算法。通过降低相关性计算开销来加速检索过程,如PQ算法,标量量化。 实现上的优化。SIMD硬件指令集加速方案;内存编排:提高cache命中率。
在ANN算法方面,我们对开源HNSW进行了优化,并自主研发了IVF算法,在保持检索精度的同时提高了性能; 在量化方面,除了PQ量化外,我们还自主研发了一套标量量化算法,支持int16、int8和int4量化,实现了单张T4显卡(2亿候选向量)的检索; 在SIMD和内存编排等实现层面的优化上也做了大量的工作。
3. 从检索算法到向量数据库
当向量数据库推向业务场景时,我们发现,向量数据通常与结构化数据配合使用。例如,在将文档表示为向量的同时,还需要存储文档所属的部门,以方便在检索时进行权限过滤。这类需求可以抽象为使用与向量相关的结构化数据进行过滤。
业界对于这种过滤需求通常有两种解决方案:
后过滤。将topK的结果扩大一定倍数,检索出更多的向量,然后用结构化数据做过滤,留下topK个。对于向量检索和DSL过滤结果的重合较少的情况,可能会出现召回结果不足topK的情况。因此,这种方法适用于结构化过滤掉的比例较低,向量召回结果比例较高的场景。
先过滤。先使用DSL过滤数据集,然后在结果中进行向量检索。这种方案适用于DSL过滤结果较少的场景;如果结果较大的话,性能会有明显的下降。
业界通常结合两种方案,对检索任务进行编排,通过分析数据分布,来决定使用哪种方案。但是,随着数据量的增加,仍然可能会出现两种检索链路性能都不好的情况。
抖音集团实践:为解决这一问题,技术团队研发了DSL定向引擎,支持在检索过程中同时进行向量检索和DSL过滤(结构化过滤)。该引擎具有以下特点:
高性能:因为在进行DSL过滤时,只需提取部分向量进行相似度计算,这会打断内存连续性,从而降低向量检索的性能。因此,DSL过滤判断的开销必须足够低,要求它远低于向量检索的开销,以确保在线检索性能。
逻辑完备:DSL语法可以支持根据场景和用户的不同定制相应的检索过滤条件,以支持业务在线检索。
按需终止:如果在向量检索和过滤过程中遍历了足够多的节点,可以保证检索效果,则应尽快退出该检索过程。
执行计划优化:根据DSL过滤结果预估结合向量分布情况,综合决策要执行的检索链路。
除了DSL定向引擎之外,我们还实现了子索引拆分、自适应精度调节和在线多路索引归并等多种定制化能力,打造了一整套向量检索工具库。
向量存储。用户将他们的向量存储在向量存储中。 批式构建。批式构建集群自动调度向量索引的构建流程。在此过程中,会筛选候选集,根据不同的精度要求适配不同的参数,构建相应的索引,然后通过P2P管道分发给在线的多副本检索服务。 在线检索服务。负责实时在线检索。
节省了索引构建资源,一次构建,多处分发。 加快索引构建,因为存算一体中,为了不影响实时检索性能,构建过程只能使用少量线程(不能使CPU满负荷运行),而存算分离后,就没有这个限制,可以将CPU满负荷运行。 在线检索服务稳定性得到明显提升,因为构建过程不再影响在线检索服务。 对自动调参特别友好。基于这套存算分离的框架,我们搭建了一套自动调参的工具库,支持用户在写入向量数据后、在索引构建前以及上线后,持续对索引的构建参数和检索参数进行调优。
3. 流式更新
优化批式加流式的更新事件产生过程。在新版本的索引上线之前,有一个批式构建过程,这个过程需要一些时间。在构建过程中,仍有新的数据更新事件出现,这需要在批式版本更新完成时,将流式更新事件订阅回拨到批式更新开始时的事件时间。等到追平这个延迟后,再继续流式更新事件。 对索引更新的改造。为了实时更新索引,我们对向量索引进行了并发安全的改造,包括HNSW和IVF索引。在提供在线检索服务的同时,我们基本可以实现向量的增删改查。这里单独把DSL索引提出来,是因为DSL索引对数据一致性的要求比较高,一条DSL更新操作写入的字段较多,数据一致性安全和更新并发性安全会明显影响在线检索性能。因此,我们采用了双buf的方案,写入操作只发生在更新buf上,检索Buf支持无锁的检索流程,整体的双buf方案也能做到秒级的更新延迟。
4. 云原生转变
多租户编排改造
自动化调度
用户接入时,通过我们的多语言SDK或http API写入自己的非结构化数据。然后,使用查询分析工具对数据进行管理和分析。进行简单配置后,即可自动化调度。从非结构化数据到向量生产的pipeline,都通过平台自动化调度实现。数据写入完成后,还支持在索引上线前进行自动调参,上线后进行流式更新,以及持续的自动调参以优化整体在线检索效果和资源成本。在在线检索阶段,支持整体服务的按需自适应弹性调度。从数据写入到在线检索的各个阶段,有全链路的监控和告警,以保证在线服务的稳定性。基于这套产品,我们预期会在大语言模型的智能问答、智能搜索、智能推荐广告、版权去重等场景下展开广泛应用。
这套云原生向量数据库有以下几个关键优势。
极致性能:内置多种火山引擎内部自研索引算法,支持内部多个百亿库,百亿级向量检索规模,检索性能在10ms内。
实时性:支持向量数据实时写入、实时更新,支持实时索引、自动索引。
稳定高效:存算分离架构,单数据多场景,节约计算资源,提高在线稳定性,保证高可用性。
多场景最佳实践:20+内部业务,多个百亿级别库检索实践,内部多个大模型场景的落地实践,例如:飞书问答,飞书文档,搜索中台、电商搜索等。
补充大模型长期记忆。对于多轮调校和个性化回答,把调校过程和用户的问答结果都通过文本编码写入向量数据库中,然后在用户提问的过程中,把问题转化为向量,在向量数据库中查找长期记忆去回顾历史,找到和当前问题最相近的历史调校结果和用户自己的问答,灌入大语言模型的context中优化整个回答的质量。
补充特定领域知识。可以在向量数据库中灌入领域知识。在用户提问的时候,提前把相关的文本信息检索出来,灌入大模型的context中,去优化大语言模型在专业领域的回答效果。
优化大模型的时效性问题。比如实时热点新闻,可以通过流式更新能力,把实时信息写入向量数据库中。在用户提问实时热点问题时,通过向量数据库把热点信息检索出来,放到大语言模型的上下文中去优化回答效果。
分享嘉宾
INTRODUCTION
杨涛
抖音
系统架构师
在抖音向量检索数据库团队负责向量检索引擎开发。
限时免费资料
往期优质文章推荐
往期推荐